package bizzard.client;
import bizzard.shared.*;

import java.util.*;
import com.google.gwt.user.client.ui.*;
import com.google.gwt.event.dom.client.*;


//+----------------------------------------------------------------------+
//| ViewList
//|
//| races			: 	hashMap indexé sur le nom de la race
//| trolls			: 	hashMap indexé sur le nom de la race
//| widget			: 	panel principal
//| add_btn			:   bouton "ajouter un troll", vide ViewTroll
//| dropTroll		: 	menu déroulant des trolls (recherche rapide)
//| dropRace  		:   menu déroulant des races, affiche les trolls de cette race
//| list	  		:   liste des trolls sous forme texte, donne le troll à ViewTroll au clic
//|
//| - affiche la liste de troll sous forme texte
//+----------------------------------------------------------------------+

public class ViewList extends Composite{

    private HashMap<String, Race> races = new HashMap<String, Race>();
    private HashMap<String, Troll> trolls = new HashMap<String, Troll>();
    private Boolean alphabetic = true;
   
    private VerticalPanel widget = new VerticalPanel();
       
    private Button add_btn, alpha_c, alpha_d;
    private ListBox dropTroll = new ListBox();
    private ListBox dropRace = new ListBox();
    private ListBox list = new ListBox();
   
    public ViewList() {
    	
	    initWidget(widget);
	    widget.addStyleName("view viewlist");
	    widget.setHorizontalAlignment(VerticalPanel.ALIGN_LEFT);
	   
	    //ajouter
	    	add_btn = new Button();
		    add_btn.setText("ajouter un troll");
		    add_btn.addClickHandler(new ClickHandler() {
	            @Override
	            public void onClick(ClickEvent event) {
	            	ViewTroll.get().clearView();
	            }
	        });
		    widget.add(add_btn);
	   
	    //recherche rapide		
		VerticalPanel search = new VerticalPanel();
		search.addStyleName("search");
		
			Label search_label = new Label("Recherche rapide");
			search_label.addStyleName("label");
			search.add(search_label);
		   
			HorizontalPanel search_row = new HorizontalPanel();
			dropTroll.addStyleName("dropBox");
		    dropTroll.addChangeHandler(new ChangeHandler() {
		        public void onChange(ChangeEvent event) {
		            if (dropTroll.getSelectedIndex()!=0)
		            	showTroll(dropTroll.getValue(dropTroll.getSelectedIndex()));
		        }
		    });
		    search_row.add(dropTroll);

			dropRace.addStyleName("dropBox");
		    dropRace.addChangeHandler(new ChangeHandler() {
			    public void onChange(ChangeEvent event) {
			    	selectRace();
			    }
		    });
		    search_row.add(dropRace);
		    search.add(search_row);
		    
	    widget.add(search);
	   
	    //systeme de tri	
		VerticalPanel sort = new VerticalPanel();
		sort.addStyleName("sort");
		
			Label sort_label = new Label("Trier par...");
			sort_label.addStyleName("label");
			sort.add(sort_label);
		   
			HorizontalPanel sort_row = new HorizontalPanel();
			Label alpha = new Label("ordre alphabetique");
			alpha.addStyleName("mini-label");
			sort_row.add(alpha);
			
			alpha_c = new Button("a-z");
			alpha_c.setEnabled(false);
			alpha_c.addClickHandler(new ClickHandler() {
	            @Override
	            public void onClick(ClickEvent event) {
	    			alpha_c.setEnabled(false);
	    			alpha_d.setEnabled(true);
	    			
	    			alphabetic = true;
	    			selectRace(); //on retrie en prenant en compte la race selectionnee (ou non)
	            }
	        });
			sort_row.add(alpha_c);
			alpha_d = new Button("z-a");
			alpha_d.setEnabled(true);
			alpha_d.addClickHandler(new ClickHandler() {
	            @Override
	            public void onClick(ClickEvent event) {
	    			alpha_d.setEnabled(false);
	    			alpha_c.setEnabled(true);
	    			
	    			alphabetic = false;
	    			selectRace();
	            }
	        });
			sort_row.add(alpha_d);
			
		    sort.add(sort_row);
		    
	    widget.add(sort);
	    
	    //liste des trolls
		    list.setVisibleItemCount(10);
		    list.addChangeHandler(new ChangeHandler() {
			    public void onChange(ChangeEvent event) {
			    	showTroll(list.getValue(list.getSelectedIndex()));
			    }
		    });
		    widget.add(list);
    }
    
	/*******************************************************************************
	 * met à jour les données de la liste de troll
	 * 
	 * @param list_troll ~ hashmap de troll
	 ******************************************************************************/
    private void feedList(HashMap<String, Troll> list_troll) {          
        list.clear();
       
        if(list_troll.isEmpty() || list_troll==null) return;
        
        //ordre alphabetique ou inverse
        TreeMap<String, Troll> les_trolls;
        if(alphabetic) les_trolls = new TreeMap<String, Troll>();
        else les_trolls = new TreeMap<String, Troll>(Collections.reverseOrder());
        
        for (String item : list_troll.keySet()) {
            les_trolls.put(item, list_troll.get(item));
        }
        
        for (String item : les_trolls.keySet()) {
        	list.addItem(item);
        }
    }
   
	/*******************************************************************************
	 * met à jour les données de la combobox de troll
	 * 
	 * @param list_troll ~ hashmap de troll
	 ******************************************************************************/
    private void feedTroll(HashMap<String, Troll> list_troll) {
        dropTroll.clear();
        if(list_troll.isEmpty() || list_troll==null) {
            dropTroll.addItem("AUCUN TROLL");
            return;
        }
       
        dropTroll.addItem("TOUS TROLLS");
        for (String item : list_troll.keySet()) {
        	dropTroll.addItem(item);
        }
    }
   
	/*******************************************************************************
	 * met à jour les données de la combobox de race
	 * 
	 * @param list_race ~ hashmap de race
	 ******************************************************************************/
    private void feedRace(HashMap<String, Race> list_race) {
        dropRace.clear();
        if(list_race.isEmpty() || list_race==null) {
            dropRace.addItem("AUCUNE RACE ?");      //ça n'est pas censé arriver
            return;
        }
               
        dropRace.addItem("TOUTES RACES");
        for (String item : list_race.keySet()) {
        	dropRace.addItem(item);
        }
    }
   
	/*******************************************************************************
	 * met à jour les données de la combobox de troll en fonction de la race selectionnee
	 ******************************************************************************/
    private void selectRace() {
        dropTroll.clear();
               
        if(dropRace.getSelectedIndex()!=0) {
            String rc = dropRace.getItemText(dropRace.getSelectedIndex()); //recupere la selection
            Race race = races.get(rc); //recupere la race
            HashMap<String, Troll> list = race.getTrolls(); //recupere les trolls de cette race
           
            feedTroll(list);
            feedList(list);
        }
        else {
            feedTroll(trolls); //on affiche tous les trolls
            feedList(trolls);              
        }
    }
   
	/*******************************************************************************
	 * setter du hashmap @races
	 * 
	 * @param races ~ hashmap de races
	 ******************************************************************************/
    public void setRaces(HashMap<String, Race> races) {
       
        if(races!=null && !races.isEmpty()) this.races = races;
    }
   
	/*******************************************************************************
	 * setter du hashmap @trolls
	 * 
	 * @param trolls ~ hashmap de trolls
	 ******************************************************************************/
    public void setTrolls(HashMap<String, Troll> trolls) {
       
        if(trolls!=null && !trolls.isEmpty()) this.trolls = trolls;
    }
   
	/*******************************************************************************
	 * met à jour l'affichage
	 ******************************************************************************/
    public void updateList() {
        feedTroll(trolls);
        feedRace(races);
        feedList(trolls);
    }
   
	/*******************************************************************************
	 * donne un troll à ViewTroll
	 * 
	 * @param key ~ nom du troll
	 ******************************************************************************/
    private void showTroll(String key) {
        Troll troll = trolls.get(key);
        if(troll==null)
                return;
       
        ViewTroll.get().setTroll(troll);
    }
}
